package com.liuqi.aiagent.ai.tool;

import com.alibaba.fastjson.JSONObject;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * webhook 工具调用的配置描述信息
 *
 * @author liuqi
 * @date 2025/7/13 21:54
 **/
@Getter
@Setter
@ToString
public class WebHookJsonSchema {

    /**
     * AI function name,由{@link #groupName} 和 {@link #SPLICING} 进行前置拼接
     *
     * 例如: groupName = test, paths.name = find_all, 那么给AI入参的function name = test$$find_all
     */
    private static final String SPLICING = "$$";

    /**
     * 工具组名称
     */
    private String groupName;

    /**
     * 服务地址
     */
    private List<String> servers;

    /**
     * 请求头
     */
    private Map<String, String> headers;

    /**
     * 请求类型
     */
    private String contentType;

    /**
     * 工具集描述
     */
    private List<Paths> paths;

    @Getter
    @Setter
    @ToString
    public static class Paths {
        /**
         * url路径
         */
        private String path;
        /**
         * 工具名称
         */
        private String name;
        /**
         * 工具描述
         */
        private String description;
        /**
         * 工具参数
         */
        private Parameters parameters;

        public String toAiFunctionString(String groupName) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("name", toolName(groupName, name));
            jsonObject.put("description", description);
            jsonObject.put("parameters", parameters);
            return jsonObject.toJSONString();
        }

        @Getter
        @Setter
        @ToString
        public static class Parameters {
            /**
             * AI tools parameters的properties描述
             */
            private Map<String, Map<String, Object>> properties;

            /**
             * 必要参数
             */
            private List<String> required;
        }
    }

    public static String toolName(String groupName, String toolName) {
        return groupName + SPLICING + toolName;
    }

}
